package com.example.day2.closure;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ClosureTest2 {

    // 闭包作用：给函数对象提供参数以外的数据
    public static void main(String[] args) throws IOException {
        // 创建 10 个任务对象,并且每个任务对象给一个任务编号
        List<Runnable> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            int k = i + 1;
            // 注意这里在lambda表达式中不能直接写i+1
            // 因为在lambda表达式中,引用的变量必须是final或者是effectively final
            // 而i每次都会变化违反了闭包的限制 因为lambda表达式引用了外部的变量称之为闭包
            // 但是这个变量需要是final或者effectively final才可以 解决方法：使用局部变量把i+1的值赋值给另外一个变量
            // 这样每次循环创建的时候都会创建一个新的变量,不会违反闭包限制
            Runnable task = () -> System.out.println(Thread.currentThread() + ":执行任务" + k);
            list.add(task);
        }

        ExecutorService service = Executors.newVirtualThreadPerTaskExecutor();
        for (Runnable runnable : list) {
            service.submit(runnable);
        }
        System.in.read();
    }
}
